iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
0
自我挑戰組

Micropython x ESP H/W 之三十個錦囊妙計系列 第 17

[錦囊XVII] 二進制處理方式 [上] --- unpack

  • 分享至 

  • xImage
  •  

相信很多人都跟筆者有過類似的困擾, 就是不大會處理從UART中讀取回來的二進制的資料, 以下介紹 如何拆解跟打包可以跟底層溝通的字串 (以WIFI BSSID 為例)

[實作] 使用unpack拆解讀到的WiFi BSSID bytes成原本的MAC Address

  1. 啟用WiFi 並切換到STA mode
import network
nic = network.WLAN(network.STA_IF)
nic.active(True)
  1. 掃描周圍的WiFi AP 裝置
nic.scan()
  1. 得到類似下面的Wi-Fi AP 清單
[(b'C56', b'0Z:Q\xb4H', 6', -26, 3, 0), (b'AVL',b'xDv\xf5\x13t', 11, -75, 4, 0)]
  1. 使用struct 中的unpack 拆解由UART 中傳回的byte
    [秘訣]
    micropython 中的struct 名稱為 ustruct , 若不習慣的話可用as 給予struct的名稱
import ustruct as struct

(2) unpack 使用方式如右: unpack(fmt,string)
(3) 筆者將使用unsigned char 的方式轉回數據
https://ithelp.ithome.com.tw/upload/images/20181030/201038243miX0XuRSM.png

  • 圖片資料引用自https://kuanyuchen.gitbooks.io
  1. 將AVL 的MAC Address 使用unpack 拆解出來 (轉換出來的值為10進制)
ustruct.unpack('BBBBBB', b'xDv\xf5\x13t')
>>> (120, 68, 118, 245, 19, 116)

[秘訣] b 一定要記得寫, 不然換錯出來的答案會是錯誤的
6. 轉成16進制後就完成

>>> (hex(120), hex(68), hex(118), hex(245), hex(19), hex(116))
>>> 0x78, 0x44, 0x76, 0xf5, 0x13, 0x74
  1. 在Ubuntu PC 上使用iw搜尋SSID 及BSSID 來驗證我們的實作是否正確
iw dev wlan0 scan |grep -Ei '^BSS|SSID'

https://ithelp.ithome.com.tw/upload/images/20181030/20103824lem7Z84JZ7.png
8. 經過交叉比對後, 證實實作結果是正確的


上一篇
[錦囊XVI] 連線到AP的種類有哪些及天線訊號容易被干擾嗎?
下一篇
[錦囊XVIII] 二進制處理方式 [下] --- pack
系列文
Micropython x ESP H/W 之三十個錦囊妙計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言